package com.linzm.leetcode.primary.exercises2_20230116;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author zimingl
 * @Date 2023/1/17 22:37
 * @Description: 统计相似字符串对的数目 状态压缩
 * 给你一个下标从 0 开始的字符串数组 words 。
 * 如果两个字符串由相同的字符组成，则认为这两个字符串 相似 。
 * 例如，"abca" 和 "cba" 相似，因为它们都由字符 'a'、'b'、'c' 组成。
 * 然而，"abacba" 和 "bcfd" 不相似，因为它们不是相同字符组成的。
 * 请你找出满足字符串 words[i] 和 words[j] 相似的下标对 (i, j) ，并返回下标对的数目，其中 0 <= i < j <= word.length - 1 。
 */
public class Demo5_2506 {
    /**
     * 输入：words = ["aba","aabb","abcd","bac","aabc"]
     * 输出：2
     * 解释：共有 2 对满足条件：
     * - i = 0 且 j = 1 ：words[0] 和 words[1] 只由字符 'a' 和 'b' 组成。
     * - i = 3 且 j = 4 ：words[3] 和 words[4] 只由字符 'a'、'b' 和 'c' 。
     */
    public static void main(String[] args) {
        Demo5_2506 demo5_2506 = new Demo5_2506();
        String[] words = {"aba", "aabb", "abcd", "bac", "aabc"};
        int num = demo5_2506.similarPairs(words);
        System.out.println(num);
    }

    public int similarPairs(String[] words) {
        int count = 0;
        for (int i = 0; i < words.length; i++) {
            char[] chars = words[i].toCharArray();
            Set<Character> set = getSet(chars);
            for (int j = i + 1; j < words.length; j++) {
                Set<Character> set2 = getSet(words[j].toCharArray());
                if (isSame(set, set2)) {
                    count++;
                }
            }
        }
        return count;
    }

    private Set<Character> getSet(char[] chars) {
        Set<Character> set = new HashSet<>();
        for (char ch : chars) {
            set.add(ch);
        }
        return set;
    }

    private boolean isSame(Set<Character> set1, Set<Character> set2) {
        List<Boolean> collect = null;
        if (set1.size() > set2.size()) {
            collect  = set1.stream().map(x -> set2.contains(x)).collect(Collectors.toList());
        } else {
            collect  = set2.stream().map(x -> set1.contains(x)).collect(Collectors.toList());
        }
        return !collect.contains(Boolean.FALSE);
    }
}
